package com.java.simple.study.jvm.memstruct.stack;

/**
 * @author zhoujunlin
 * @date 2022年05月26日 20:38
 * @desc 虚方法测试
 */
public class TestVirtualMethod {


}

class Father {
    public Father() {
        System.out.println("father构造器");
    }

    public static void showStatic(String str) {
        System.out.println("father show static " + str);
    }

    public final void showFinal() {
        System.out.println("father show final");
    }

    public void showCommon() {
        System.out.println("father common");
    }
}

class Son extends Father {
    public Son() {
        // invokespecial
        super();
    }

    public Son(int age) {
        // invokespecial
        this();
    }

    // 不是重写方法 静态方法不能被重写
    public static void showStatic(String str) {
        System.out.println("son show static " + str);
    }

    private void showPrivate(String str) {
        System.out.println("son show private " + str);
    }

    public void show() {
        // invokestatic
        showStatic("hello");
        super.showStatic("hello!");
        //invokespecial
        showPrivate("good");
        super.showCommon();

        // invokevirtual
        // 因为此方法声明有final 不能被子类重写 所以也认为此方法为非虚方法
        showFinal();

        // invokevirtual 没有显示调用super 编译器认为你可能调用子类的showCommon 即时你没有重写此方法
        // 即编译期间确定不下来 就是虚方法
        showCommon();
        info();

        MethodInterface mi = null;
        // invokeinterface
        mi.methodA();
    }

    public void info() {

    }

    public void display(Father father) {
        father.showCommon();
    }

}

interface MethodInterface {
    void methodA();
}
